/* global data for booleans */
static int bool_num = 0;
static int *bool_pending_values = NULL;
+static size_t bool_maxstr;
static int flask_security_make_bools(void);
extern int ss_initialized;
perms, NULL);
}
-static int flask_copyin_string(XEN_GUEST_HANDLE_PARAM(char) u_buf, char **buf, uint32_t size)
+static int flask_copyin_string(XEN_GUEST_HANDLE_PARAM(char) u_buf, char **buf,
+ size_t size, size_t max_size)
{
- char *tmp = xmalloc_bytes(size + 1);
+ char *tmp;
+
+ if ( size > max_size )
+ return -ENOENT;
+
+ tmp = xmalloc_array(char, size + 1);
if ( !tmp )
return -ENOMEM;
if ( rv )
return rv;
- rv = flask_copyin_string(arg->u.user, &user, arg->size);
+ rv = flask_copyin_string(arg->u.user, &user, arg->size, PAGE_SIZE);
if ( rv )
return rv;
if ( rv )
return rv;
- rv = flask_copyin_string(arg->context, &buf, arg->size);
+ rv = flask_copyin_string(arg->context, &buf, arg->size, PAGE_SIZE);
if ( rv )
return rv;
if ( arg->bool_id != -1 )
return 0;
- rv = flask_copyin_string(arg->name, &name, arg->size);
+ rv = flask_copyin_string(arg->name, &name, arg->size, bool_maxstr);
if ( rv )
return rv;
int num;
int *values;
- rv = security_get_bools(&num, NULL, &values);
+ rv = security_get_bools(&num, NULL, &values, NULL);
if ( rv != 0 )
goto out;
xfree(bool_pending_values);
- ret = security_get_bools(&num, NULL, &values);
+ ret = security_get_bools(&num, NULL, &values, &bool_maxstr);
if ( ret != 0 )
goto out;
#ifndef _FLASK_CONDITIONAL_H_
#define _FLASK_CONDITIONAL_H_
-int security_get_bools(int *len, char ***names, int **values);
+#include <xen/types.h>
+
+int security_get_bools(int *len, char ***names, int **values, size_t *maxstr);
int security_set_bools(int len, int *values);
return rv;
}
-int security_get_bools(int *len, char ***names, int **values)
+int security_get_bools(int *len, char ***names, int **values, size_t *maxstr)
{
int i, rc = -ENOMEM;
if ( names )
*names = NULL;
*values = NULL;
+ if ( maxstr )
+ *maxstr = 0;
*len = policydb.p_bools.nprim;
if ( !*len )
for ( i = 0; i < *len; i++ )
{
- size_t name_len;
+ size_t name_len = strlen(policydb.p_bool_val_to_name[i]);
+
(*values)[i] = policydb.bool_val_to_struct[i]->state;
if ( names ) {
- name_len = strlen(policydb.p_bool_val_to_name[i]) + 1;
- (*names)[i] = (char*)xmalloc_array(char, name_len);
+ (*names)[i] = xmalloc_array(char, name_len + 1);
if ( !(*names)[i] )
goto err;
- strlcpy((*names)[i], policydb.p_bool_val_to_name[i], name_len);
- (*names)[i][name_len - 1] = 0;
+ strlcpy((*names)[i], policydb.p_bool_val_to_name[i], name_len + 1);
}
+ if ( maxstr && name_len > *maxstr )
+ *maxstr = name_len;
}
rc = 0;
out:
struct cond_bool_datum *booldatum;
struct cond_node *cur;
- rc = security_get_bools(&nbools, &bnames, &bvalues);
+ rc = security_get_bools(&nbools, &bnames, &bvalues, NULL);
if ( rc )
goto out;
for ( i = 0; i < nbools; i++ )